Objective-C 类和对象

版权说明:本文为原创文章,未经允许,不得转载。

类和对象

1.类的概念

类是对同一类事物的抽象,类中定义了这一类对象中所具有的静态属性(属性)和动态属性(方法)。

2.类和对象

对象是类的一个实例,是一个具体的事物,类与对象是抽象与具体的关系。

类的定义

Objective-C中,定义一个类,需要 XXX.h 和 XXX.m 两个文件。

1..h文件:

放类的声明,包括成员变量、属性和方法声明(事实上.h文件不参与编译过程);关键字@interface声明一个类,同时它必须以@end结束,在这两个关键字中间声明相关成员;

@interface newClassName:ParentClassName
{
    定义属性(全局变量/实例变量);
}
方法的声明;
@end

2..m文件:

放属性、方法的具体实现;关键字@implementation用于实现某个类,同时必须以@end结尾,在这两个关键字中间实现具体的属性、方法;

@inplementation newClassName
方法的实现
{
    code;
}

3.NSObject类

Objective-C 类中,所有的类都继承于 NSObject 类,由于这个类在Foundation框架中定义,所以需要导入

方法

1.方法的声明

方法的定义格式: 方法说明(返回类型)方法名:(参数类型)参数名称;

方法的说明有两种:

· 减号 “-“,表示该方法是对象方法,必须用对象实例才能调用。
· 加好 “+”,表示该方法为类方法,可以用类直接调用。

看个例子:

- (void)setBounds:(ShapeRect)bounds;

该方法的名称为 “setBounds:” ,冒号是包含在名称里的。

再看一个多参数方法的声明:

- (void)setName:(NSString *)name setAge:(NSInteger)age;

该方法的名称为 “setName:setAge:”

2.实例化对象

使用 alloc 来创建一个对象,编译器会给该对象分配一块可用的内存地址,然后使用 init 对对象进行初始化,对象才可以使用。如:

NSObject *object = [[NSObject alloc] init];
Person *person = [[Person alloc] init];

3.方法的调用

Objective-C 中,方法的调用方式为:

对象方法:[对象变量 方法名 参数];
类方法:[类名 方法名 参数];

例如:

[person setName:@"zhangsan"];

多个参数的对象方法调用:

[person setName:@"lisi" setAge:22];

类的初始化

1.自定义初始化方法

类的初始化方法名称必须以 init 开头,例如:

- (id)initWithName:(NSString *)name addAge:(NSInteger)age;

在类的实现文件中,则:

- (id)initWithName:(NSString *)name addAge:(NSInteger)age
{
    //调用父类的初始化方法
    self = [super init];
    if(self != nil){
        self.name = name;
        self.age = age;
    }
}

self 指代当前类对象,super 代表的是父类,这段代码是通过父类的方法给当前对象赋值,然后判断这个对象是否为 nil ,如果不为 nil 则给 name 和 age 属性赋值。

使用初始化方法:

int main(int argc, const charchar * argv[]) {  
    @autoreleasepool {
    Person *person = [[Person alloc] initWithName:@"zhangsan" addAge:18];
    NSLog(@"name:%@, age:%@", person.name, person.age);
    }
}

2.点语法

点语法可以用来代替 get/set 方法,例如:

person.name = @"zhangsan";
[person setName = @"zhangsan"];

以上两条代码效果是一样的。但是,在Objective-C中使用点语法有两个条件:

· 必须是属性。
· 有对应的 set/get 方法。

需要注意的是点语法和 self,例如:

- (void)setAge:(NSInteger)age{
    self.age = age;
}

因为 Objective-C 中点语法的本质是方法调用,第二行代码相当于 [self setAge:age],所以会造成循环调用 setAge: 方法,造成死循环。